<?php
namespace app\common\library;

use think\cache\driver\Redis;

class VerifyCodeManager
{
    /** @var Redis Redis实例 */
    private $redis;
    
    /** @var string 键名前缀 */
    private $keyPrefix = 'verify_code:';
    
    /** @var int 过期时间（秒）：60秒 */
    private $expireTime = 60;

    public function __construct()
    {
        $this->redis = new Redis();
    }

    /**
     * 设置邮箱验证码
     * @param string $email 用户邮箱
     * @param string $code 验证码
     * @return bool
     */
    public function setEmailCode(string $email, string $code): bool
    {
        $key = $this->getKey($email);
        
        // 构建验证码数据（包含创建时间）
        $codeData = [
            'code' => $code,
            'created_at' => time()
        ];
        
        // 存储并设置过期时间
        return $this->redis->set(
            $key,
            json_encode($codeData, JSON_UNESCAPED_UNICODE),
            $this->expireTime
        );
    }

    /**
     * 验证邮箱验证码
     * @param string $email 用户邮箱
     * @param string $inputCode 用户输入的验证码
     * @return bool
     */
    public function verifyEmailCode(string $email, string $inputCode): bool
    {
        $key = $this->getKey($email);
        $codeJson = $this->redis->get($key);
        
        if (!$codeJson) {
            return false; // 验证码不存在或已过期
        }
        
        $codeData = json_decode($codeJson, true);
        
        // 验证验证码是否匹配
        if ($codeData['code'] === $inputCode) {
            // 验证通过后删除验证码（防止重复使用）
            $this->redis->rm($key);
            return true;
        }
        
        return false;
    }

    /**
     * 获取键名
     * @param string $email
     * @return string
     */
    private function getKey(string $email): string
    {
        return "{$this->keyPrefix}{$email}";
    }
}